package com.ai.platform.common.util;

import com.ai.platform.model.dto.Input;
import com.ai.platform.model.dto.Output;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import org.springframework.util.Base64Utils;

import java.io.Serializable;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述 平台工具类
 * 创建者 yeyingsheng
 * 创建时间 2018年06月07日
 */
public class AiPlatformUtil {

    /**
     * id分割符
     */
    public final static String SPLIT_ID=",";

    /**
     * session用户对象
     */
    public final static String PLATFORM_SESSION_USER_SUBJECT="platform_session_user_subject";

    /**
     * 密码生成
     * @param credentials
     * @param salt
     * @return
     */
    public static String generatorPassword(String credentials,String salt){
        //加密类型
        String hashAlgorithmName = "MD5";
        //循环次数
        int hashIterations = 1024;
        //盐值
        ByteSource credentialsSalt = ByteSource.Util.bytes(salt);
        Object obj = new SimpleHash(hashAlgorithmName, credentials, credentialsSalt, hashIterations);
        return obj.toString();
    }

    /**
     * 返回信息设置
     * @param output
     * @param code
     * @param msg
     */
    public static void returnMsgBuild(Output output,String code,String msg){
        returnMsgBuild(output,code,msg,null);
    }

    /**
     * 返回信息设置
     * @param output
     * @param code
     * @param msg
     * @param data
     */
    public static void returnMsgBuild(Output output,String code,String msg,Object data){
        output.setCode(code);
        output.setMsg(msg);
        output.setData(data);
    }

    /**
     * 取得登录用户对象
     * @param input
     * @return
     */
    public static Object getSessionObj(Input input,Class clazz){
        String str=input.getValue(MD5(PLATFORM_SESSION_USER_SUBJECT));
        if(StringUtils.isBlank(str)){
            return null;
        }
        Object obj=JSON.parseObject(Base64Utils.decodeFromString(str), clazz);
        return obj;
    }

    public static List<Serializable> strToList(String str,Class clazz){
        if(StringUtils.isBlank(str)){
            return null;
        }
        String[] arr=str.split(SPLIT_ID);
        if(null==arr || arr.length==0){
            return null;
        }
        List<Serializable> list=new ArrayList<>();
        for(String s:arr){
            if(null!=clazz && clazz.getName().equals("java.lang.Integer")){
               list.add(Integer.parseInt(s));
            }else {
                list.add(s);
            }
        }
        return list;
    }

    /**
     * md5加密
     * @param s
     * @return
     */
    public static String MD5(String s) {

        char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

        try {
            byte[] btInput = s.getBytes();
            // 获得MD5摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(btInput);
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}
